package com.ymatou.query.trading.api.testcase;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.experimental.categories.Category;

import com.ymatou.query.seller.trading.api.parameter.GetOrderProductListArguments;
import com.ymatou.query.seller.trading.api.parameter.GetOrderProductListResponse;
import com.ymatou.query.seller.trading.api.parameter.Pagination;
import com.ymatou.query.seller.trading.api.parameter.GetOrderProductListResponse.OrderProductInfo;
import com.ymatou.query.trading.api.parameter.GetOrderProductListBean;
import com.ymatou.query.trading.api.service.GetOrderProductListCall;
import com.ymt.core.tool.Logger;
import com.ymt.utils.annotation.TestCase;
import com.ymt.utils.annotation.TestSuite;
import com.ymt.utils.tag.P1;
import com.ymttest.database.sqlwapper.YmtOrdersWapper;
import com.ymttest.utils.DataUtil;
import com.ymttest.utils.EnvSetup;
import com.ymttest.utils.constant.ECode;

/**
 * 获取订单中商品数据 FreeMaker Template自动生成代码
 */
@TestSuite
public class Ts_GetOrderProductList {

	private static GetOrderProductListBean getorderproductlistbean;
	private static GetOrderProductListCall getorderproductlistcall;

	@BeforeClass
	public static void setUp() {
		Logger.createResultFile("获取订单中商品数据");
	}

	@Before
	public void caseUp() {

		getorderproductlistbean = new GetOrderProductListBean();
		getorderproductlistcall = new GetOrderProductListCall();
	}

	@AfterClass
	public static void tearDown() {
		Logger.generateResult(getorderproductlistcall.getOpurl());
	}

	@After
	public void caseDown() {
		Logger.end();
	}

	private void verify() {
		GetOrderProductListResponse expectedResponse = new GetOrderProductListResponse();
		ConstructExpectedResponse(expectedResponse);
		GetOrderProductListResponse actualResponse = getorderproductlistcall
				.getOrderProductListResponse();
		DataUtil.verifyEquals(expectedResponse.getOrderProductList().size(),
				actualResponse.getOrderProductList().size(),
				"验证OrderProductList的数量");
		List<OrderProductInfo> expects = expectedResponse.getOrderProductList();
		List<OrderProductInfo> actuals = actualResponse.getOrderProductList();
		if(false == DataUtil.isNullOrEmpty(expects)){
			for(OrderProductInfo expect : expects){
				String expId = expect.getProductId();
				int expNum = expect.getProductAmount();
				boolean exists = actuals.stream().anyMatch(x->x.getProductId().equals(expId));
				DataUtil.verifyEquals(true, exists, "验证期望的ProductId:"+expId+"在实际返回中是否存在");
				if(exists){
					int actNum = actuals.stream().filter(x->x.getProductId().equals(expId)).collect(Collectors.toList()).get(0).getProductAmount();
					DataUtil.verifyEquals(expNum, actNum, "验证期望的ProductId:"+expId+"的ProductAmount");
				}
			}
		}
	}

	@SuppressWarnings("rawtypes")
	private void ConstructExpectedResponse(GetOrderProductListResponse response) {
		GetOrderProductListArguments args = new GetOrderProductListArguments();
		args.setIsShangouOrder(getorderproductlistbean.getIsShangouOrder());
		args.setPageIndex(getorderproductlistbean.getPageIndex());
		args.setPageSize(getorderproductlistbean.getPageSize());
		args.setSellerId(getorderproductlistbean.getSellerId());
		args.setOrderStatusList(getorderproductlistbean.getOrderStatusList());
		List<Map> results = Execute(args);
		ConvertResult(results, response);
	}

	@SuppressWarnings("rawtypes")
	private void ConvertResult(List<Map> results,
			GetOrderProductListResponse response) {
		List<GetOrderProductListResponse.OrderProductInfo> orderProductList = new ArrayList<GetOrderProductListResponse.OrderProductInfo>();
		if (false == DataUtil.isNullOrEmpty(results)) {
			for (Map m : results) {
				GetOrderProductListResponse.OrderProductInfo info = new GetOrderProductListResponse.OrderProductInfo();
				info.setProductId(String.valueOf(m.get("ID")));
				info.setProductAmount(DataUtil.Integerr.GetValueOrDefault(m
						.get("Count")));
				orderProductList.add(info);
			}
		}
		response.setOrderProductList(orderProductList);
	}

	@SuppressWarnings("rawtypes")
	private List<Map> Execute(GetOrderProductListArguments args) {
		Pagination pagination = new Pagination(args.getPageIndex(),
				args.getPageSize());

		int sellerId = args.getSellerId();
		Boolean shangou = args.isIsShangouOrder();
		List<Integer> orderStatus = args.getOrderStatusList(); // orderStatusXml
		int rowFrom = pagination.getPageItemIndexFrom();
		int rowTo = pagination.getPageItemIndexTo();
		boolean orderStatusExists = false;
		if (DataUtil.isNullOrEmpty(args.getOrderStatusList()) == false) {
			orderStatusExists = true;
		}
		YmtOrdersWapper wapper = new YmtOrdersWapper();
		String queryField = "info.sProductId as ID, sum(info.iAmount) as Count";
		String joinCondition = "join [Ymt_OrderInfo](nolock) info on o.iOrderId = info.iOrderId";
		StringBuilder queryCondition = new StringBuilder();
		queryCondition.append("o.iBuyerId = " + sellerId
				+ " and info.sProductId is not null");
		if (shangou != null) {
			queryCondition.append(" and o.bShangouOrder = "
					+ DataUtil.bool2Int(shangou));
		}
		if (orderStatusExists) {
			queryCondition.append(" and o.iTradingStatus in "
					+ DataUtil.toInOfSql(orderStatus));
		}
		queryCondition.append(" group by sProductId");
		queryCondition.append(" order by Count desc offset " + (rowFrom - 1)
				+ " rows fetch next " + (rowTo - rowFrom + 1) + " rows only");
		return wapper.selectOrders2(queryField, joinCondition,
				queryCondition.toString());
	}

//	@Test
//	@Category(P1.class)
//	@TestCase
//	public void Tc_GetOrderProductList_001() {
//		Logger.start(true, "获取订单中订单状态为1的商品数据成功");
//		try {
//			int SellerId = Integer.valueOf(EnvSetup.getData("SellerId"));
//			// 参数
//			getorderproductlistbean.setIsShangouOrder(false);
//			ArrayList<Integer> list = new ArrayList<Integer>();
//			list.add(1);
//			getorderproductlistbean.setOrderStatusList(list);
//			getorderproductlistbean.setPageIndex(1);
//			getorderproductlistbean.setPageSize(10);
//			getorderproductlistbean.setSellerId(SellerId);
//			// 发送请求
//			getorderproductlistcall.setData(getorderproductlistbean);
//			getorderproductlistcall.callService();
//			Logger.comment("getorderproductlistcall send:"
//					+ getorderproductlistcall.getEntityString());
//			Logger.comment("getorderproductlistcall response:"
//					+ getorderproductlistcall.getReturnData());
//			Logger.verifyEquals(ECode.SUCCESS,
//					getorderproductlistcall.getCode(), "验证Code");
//			verify();
//		} catch (Exception e) {
//			Logger.fail(e);
//		}
//	}
//
//	@Test
//	@Category(P1.class)
//	@TestCase
//	public void Tc_GetOrderProductList_002() {
//		Logger.start(true, "获取订单中订单状态为2的商品数据成功");
//		try {
//			int SellerId = Integer.valueOf(EnvSetup.getData("SellerId"));
//			// 参数
//			getorderproductlistbean.setIsShangouOrder(false);
//			ArrayList<Integer> list = new ArrayList<Integer>();
//			list.add(2);
//			getorderproductlistbean.setOrderStatusList(list);
//			getorderproductlistbean.setPageIndex(2);
//			getorderproductlistbean.setPageSize(2);
//			getorderproductlistbean.setSellerId(SellerId);
//			// 发送请求
//			getorderproductlistcall.setData(getorderproductlistbean);
//			getorderproductlistcall.callService();
//			Logger.comment("getorderproductlistcall send:"
//					+ getorderproductlistcall.getEntityString());
//			Logger.comment("getorderproductlistcall response:"
//					+ getorderproductlistcall.getReturnData());
//			Logger.verifyEquals(ECode.SUCCESS,
//					getorderproductlistcall.getCode(), "验证Code");
//			verify();
//		} catch (Exception e) {
//			Logger.fail(e);
//		}
//	}
//
//	@Test
//	@Category(P1.class)
//	@TestCase
//	public void Tc_GetOrderProductList_003() {
//		Logger.start(true, "获取订单中订单状态为3的商品数据成功");
//		try {
//			int SellerId = Integer.valueOf(EnvSetup.getData("SellerId"));
//			// 参数
//			getorderproductlistbean.setIsShangouOrder(false);
//			ArrayList<Integer> list = new ArrayList<Integer>();
//			list.add(3);
//			getorderproductlistbean.setOrderStatusList(list);
//			getorderproductlistbean.setPageIndex(1);
//			getorderproductlistbean.setPageSize(3);
//			getorderproductlistbean.setSellerId(SellerId);
//			// 发送请求
//			getorderproductlistcall.setData(getorderproductlistbean);
//			getorderproductlistcall.callService();
//			Logger.comment("getorderproductlistcall send:"
//					+ getorderproductlistcall.getEntityString());
//			Logger.comment("getorderproductlistcall response:"
//					+ getorderproductlistcall.getReturnData());
//			Logger.verifyEquals(ECode.SUCCESS,
//					getorderproductlistcall.getCode(), "验证Code");
//			verify();
//		} catch (Exception e) {
//			Logger.fail(e);
//		}
//	}
//
//	@Test
//	@Category(P1.class)
//	@TestCase
//	public void Tc_GetOrderProductList_004() {
//		Logger.start(true, "获取订单中订单状态为4的商品数据成功");
//		try {
//			int SellerId = Integer.valueOf(EnvSetup.getData("SellerId"));
//			// 参数
//			getorderproductlistbean.setIsShangouOrder(false);
//			ArrayList<Integer> list = new ArrayList<Integer>();
//			list.add(4);
//			getorderproductlistbean.setOrderStatusList(list);
//			getorderproductlistbean.setPageIndex(1);
//			getorderproductlistbean.setPageSize(3);
//			getorderproductlistbean.setSellerId(SellerId);
//			// 发送请求
//			getorderproductlistcall.setData(getorderproductlistbean);
//			getorderproductlistcall.callService();
//			Logger.comment("getorderproductlistcall send:"
//					+ getorderproductlistcall.getEntityString());
//			Logger.comment("getorderproductlistcall response:"
//					+ getorderproductlistcall.getReturnData());
//			Logger.verifyEquals(ECode.SUCCESS,
//					getorderproductlistcall.getCode(), "验证Code");
//			verify();
//		} catch (Exception e) {
//			Logger.fail(e);
//		}
//	}
//
//	@Test
//	@Category(P1.class)
//	@TestCase
//	public void Tc_GetOrderProductList_005() {
//		Logger.start(true, "获取订单中订单状态为12的商品数据成功");
//		try {
//			int SellerId = Integer.valueOf(EnvSetup.getData("SellerId"));
//			// 参数
//			getorderproductlistbean.setIsShangouOrder(false);
//			ArrayList<Integer> list = new ArrayList<Integer>();
//			list.add(12);
//			getorderproductlistbean.setOrderStatusList(list);
//			getorderproductlistbean.setPageIndex(1);
//			getorderproductlistbean.setPageSize(3);
//			getorderproductlistbean.setSellerId(SellerId);
//			// 发送请求
//			getorderproductlistcall.setData(getorderproductlistbean);
//			getorderproductlistcall.callService();
//			Logger.comment("getorderproductlistcall send:"
//					+ getorderproductlistcall.getEntityString());
//			Logger.comment("getorderproductlistcall response:"
//					+ getorderproductlistcall.getReturnData());
//			Logger.verifyEquals(ECode.SUCCESS,
//					getorderproductlistcall.getCode(), "验证Code");
//			verify();
//		} catch (Exception e) {
//			Logger.fail(e);
//		}
//	}
//
//	@Test
//	@Category(P1.class)
//	@TestCase
//	public void Tc_GetOrderProductList_006() {
//		Logger.start(true, "获取订单中订单状态为13的商品数据成功");
//		try {
//			int SellerId = Integer.valueOf(EnvSetup.getData("SellerId"));
//			// 参数
//			getorderproductlistbean.setIsShangouOrder(false);
//			ArrayList<Integer> list = new ArrayList<Integer>();
//			list.add(13);
//			getorderproductlistbean.setOrderStatusList(list);
//			getorderproductlistbean.setPageIndex(1);
//			getorderproductlistbean.setPageSize(3);
//			getorderproductlistbean.setSellerId(SellerId);
//			// 发送请求
//			getorderproductlistcall.setData(getorderproductlistbean);
//			getorderproductlistcall.callService();
//			Logger.comment("getorderproductlistcall send:"
//					+ getorderproductlistcall.getEntityString());
//			Logger.comment("getorderproductlistcall response:"
//					+ getorderproductlistcall.getReturnData());
//			Logger.verifyEquals(ECode.SUCCESS,
//					getorderproductlistcall.getCode(), "验证Code");
//			verify();
//		} catch (Exception e) {
//			Logger.fail(e);
//		}
//	}
//
//	@Test
//	@Category(P1.class)
//	@TestCase
//	public void Tc_GetOrderProductList_007() {
//		Logger.start(true, "获取订单中订单状态为18的商品数据成功");
//		try {
//			int SellerId = Integer.valueOf(EnvSetup.getData("SellerId"));
//			// 参数
//			getorderproductlistbean.setIsShangouOrder(false);
//			ArrayList<Integer> list = new ArrayList<Integer>();
//			list.add(18);
//			getorderproductlistbean.setOrderStatusList(list);
//			getorderproductlistbean.setPageIndex(1);
//			getorderproductlistbean.setPageSize(3);
//			getorderproductlistbean.setSellerId(SellerId);
//			// 发送请求
//			getorderproductlistcall.setData(getorderproductlistbean);
//			getorderproductlistcall.callService();
//			Logger.comment("getorderproductlistcall send:"
//					+ getorderproductlistcall.getEntityString());
//			Logger.comment("getorderproductlistcall response:"
//					+ getorderproductlistcall.getReturnData());
//			Logger.verifyEquals(ECode.SUCCESS,
//					getorderproductlistcall.getCode(), "验证Code");
//			verify();
//		} catch (Exception e) {
//			Logger.fail(e);
//		}
//	}
//
//	@Test
//	@Category(P1.class)
//	@TestCase
//	public void Tc_GetOrderProductList_008() {
//		Logger.start(true, "获取订单中订单状态为16的商品数据成功");
//		try {
//			int SellerId = Integer.valueOf(EnvSetup.getData("SellerId"));
//			// 参数
//			getorderproductlistbean.setIsShangouOrder(false);
//			ArrayList<Integer> list = new ArrayList<Integer>();
//			list.add(16);
//			getorderproductlistbean.setOrderStatusList(list);
//			getorderproductlistbean.setPageIndex(1);
//			getorderproductlistbean.setPageSize(3);
//			getorderproductlistbean.setSellerId(SellerId);
//			// 发送请求
//			getorderproductlistcall.setData(getorderproductlistbean);
//			getorderproductlistcall.callService();
//			Logger.comment("getorderproductlistcall send:"
//					+ getorderproductlistcall.getEntityString());
//			Logger.comment("getorderproductlistcall response:"
//					+ getorderproductlistcall.getReturnData());
//			Logger.verifyEquals(ECode.SUCCESS,
//					getorderproductlistcall.getCode(), "验证Code");
//			verify();
//		} catch (Exception e) {
//			Logger.fail(e);
//		}
//	}
//
//	@Test
//	@Category(P1.class)
//	@TestCase
//	public void Tc_GetOrderProductList_009() {
//		Logger.start(true, "获取订单中订单状态为17的商品数据成功");
//		try {
//			int SellerId = Integer.valueOf(EnvSetup.getData("SellerId"));
//			// 参数
//			getorderproductlistbean.setIsShangouOrder(false);
//			ArrayList<Integer> list = new ArrayList<Integer>();
//			list.add(17);
//			getorderproductlistbean.setOrderStatusList(list);
//			getorderproductlistbean.setPageIndex(1);
//			getorderproductlistbean.setPageSize(3);
//			getorderproductlistbean.setSellerId(SellerId);
//			// 发送请求
//			getorderproductlistcall.setData(getorderproductlistbean);
//			getorderproductlistcall.callService();
//			Logger.comment("getorderproductlistcall send:"
//					+ getorderproductlistcall.getEntityString());
//			Logger.comment("getorderproductlistcall response:"
//					+ getorderproductlistcall.getReturnData());
//			Logger.verifyEquals(ECode.SUCCESS,
//					getorderproductlistcall.getCode(), "验证Code");
//			verify();
//		} catch (Exception e) {
//			Logger.fail(e);
//		}
//	}
//
//	@Test
//	@Category(P1.class)
//	@TestCase
//	public void Tc_GetOrderProductList_010() {
//		Logger.start(true, "获取订单中订单状态为101的商品数据成功");
//		try {
//			int SellerId = Integer.valueOf(EnvSetup.getData("SellerId"));
//			// 参数
//			getorderproductlistbean.setIsShangouOrder(false);
//			ArrayList<Integer> list = new ArrayList<Integer>();
//			list.add(101);
//			getorderproductlistbean.setOrderStatusList(list);
//			getorderproductlistbean.setPageIndex(1);
//			getorderproductlistbean.setPageSize(3);
//			getorderproductlistbean.setSellerId(SellerId);
//			// 发送请求
//			getorderproductlistcall.setData(getorderproductlistbean);
//			getorderproductlistcall.callService();
//			Logger.comment("getorderproductlistcall send:"
//					+ getorderproductlistcall.getEntityString());
//			Logger.comment("getorderproductlistcall response:"
//					+ getorderproductlistcall.getReturnData());
//			Logger.verifyEquals(ECode.SUCCESS,
//					getorderproductlistcall.getCode(), "验证Code");
//			verify();
//		} catch (Exception e) {
//			Logger.fail(e);
//		}
//	}
	
	@Test
	@Category(P1.class)
	@TestCase
	public void Tc_GetOrderProductList_011() {
		Logger.start(true, "获取订单中的商品数据成功, 不传OrderStatusList");
		try {
			int SellerId = Integer.valueOf(EnvSetup.getData("SellerId"));
			// 参数
			getorderproductlistbean.setIsShangouOrder(false);
			getorderproductlistbean.setPageIndex(1);
			getorderproductlistbean.setPageSize(3);
			getorderproductlistbean.setSellerId(SellerId);
			// 发送请求
			getorderproductlistcall.setData(getorderproductlistbean);
			getorderproductlistcall.callService();
			Logger.comment("getorderproductlistcall send:"
					+ getorderproductlistcall.getEntityString());
			Logger.comment("getorderproductlistcall response:"
					+ getorderproductlistcall.getReturnData());
			Logger.verifyEquals(ECode.SUCCESS,
					getorderproductlistcall.getCode(), "验证Code");
			verify();
		} catch (Exception e) {
			Logger.fail(e);
		}
	}
}